package com.spring.redis.operation.service.base.impl;

import com.spring.redis.operation.service.base.SetRedisBaseService;
import lombok.NonNull;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * @author zhouyu
 */
@Service
public class SetRedisBaseServiceImpl extends RedisBaseServiceImpl implements SetRedisBaseService {

    private final SetOperations<String, Object> setOperations;

    public SetRedisBaseServiceImpl(RedisTemplate<String, Object> redisTemplate, SetOperations<String, Object> setOperations) {
        super(redisTemplate);
        this.setOperations = setOperations;
    }

    /**
     * 将数据放入set缓存
     *
     * @param key    键
     * @param values 值
     * @return long 成功个数
     */
    @Override
    public Long sSet(@NonNull String key, @NonNull Object... values) {
        return setOperations.add(key, values);
    }

    /**
     * 将数据放入set缓存,并设置过期时间
     *
     * @param key    key
     * @param time   time
     * @param values values
     * @return java.lang.Long 成功个数
     */
    @Override
    public Long sSetExpire(@NonNull String key, @NonNull Long time, @NonNull Object... values) {
        Long aLong = sSet(key, values);
        if (aLong > 0) {
            expire(key, time);
        }
        return aLong;
    }

    /**
     * 根据key获取Set中的所有值
     *
     * @param key key
     * @return java.util.Set<Object>
     */
    @Override
    public Set<Object> sGetAll(@NonNull String key) {
        return setOperations.members(key);
    }

    /**
     * 根据key,value从一个set中查询,是否存在
     *
     * @param key   键
     * @param value 值
     * @return java.lang.Boolean 是否存在
     */
    @Override
    public Boolean sHasKey(@NonNull String key, @NonNull Object value) {
        return setOperations.isMember(key, value);
    }

    /**
     * 获取set缓存的长度
     *
     * @param key 键
     * @return java.lang.Long set长度
     */
    @Override
    public Long sSetSize(@NonNull String key) {
        return setOperations.size(key);
    }

    /**
     * 移除值为value的
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return java.lang.Long 移除的个数
     */
    @Override
    public Long setRemove(@NonNull String key, @NonNull Object... values) {
        return setOperations.remove(key, values);
    }
}
